package proyecto.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import javax.sql.DataSource;
import proyecto.excepcion.DAOExcepcion;
import proyecto.modelo.Resultado;
import proyecto.modelo.Rol;

public class RolDAOImpl extends BaseDAO implements RolDAO {

    private DataSource dataSource;

    public DataSource getDataSource() {
        return dataSource;
    }

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public Collection<Rol> buscarPorNombre(String nombre)
            throws DAOExcepcion {
        String query = "select rol_nombre, descripcion from rol where rol_nombre like ?";
        Collection<Rol> lista = new ArrayList<Rol>();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, "%" + nombre + "%");
            rs = stmt.executeQuery();
            while (rs.next()) {
                Rol vo = new Rol();
                vo.setRolNombre(rs.getString("rol_nombre"));
                vo.setDescripcion(rs.getString("descripcion"));
                lista.add(vo);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        System.out.println(lista.size());
        return lista;
    }

    public Rol insertar(Rol vo) throws DAOExcepcion {
        String query = "INSERT INTO rol(rol_nombre,descripcion) VALUES (?,?)";
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, vo.getRolNombre());
            stmt.setString(2, vo.getDescripcion());
            int i = stmt.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo insertar");
            }
            // Obtener el ultimo id
            String nombre = "";
            query = "SELECT LAST_INSERT_ID()";
            stmt = con.prepareStatement(query);
            rs = stmt.executeQuery();
            if (rs.next()) {
                nombre = rs.getString(1);
            }
            vo.setRolNombre(nombre);

        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return vo;
    }

    public Rol obtener(String rolNombre) throws DAOExcepcion {
        Rol vo = new Rol();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            String query = "select rol_nombre, descripcion from rol where rol_nombre=?";
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, rolNombre);
            rs = stmt.executeQuery();
            if (rs.next()) {
                vo.setRolNombre(rs.getString("rol_nombre"));
                vo.setDescripcion(rs.getString("descripcion"));
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return vo;
    }

    public void eliminar(String rolNombre) throws DAOExcepcion {
        String query = "DELETE FROM rol WHERE rol_nombre=?";
        Connection con = null;
        PreparedStatement stmt = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, rolNombre);
            int i = stmt.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo eliminar");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
    }

    public Rol actualizar(Rol vo) throws DAOExcepcion {
        String query = "update rol set descripcion=? where rol_nombre=?";
        System.out.println("s: " + vo.getRolNombre());
        System.out.println("s: " + vo.getDescripcion());
        Connection con = null;
        PreparedStatement stmt = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, vo.getDescripcion());
            stmt.setString(2, vo.getRolNombre());
            int i = stmt.executeUpdate();
            System.out.println(i);
            if (i != 1) {
                throw new SQLException("No se pudo actualizarrrrrr  here the error!");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return vo;
    }

    public Collection<Rol> listar() throws DAOExcepcion {
        Collection<Rol> c = new ArrayList<Rol>();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            String query = "SELECT rol_nombre,descripcion from rol";
            stmt = con.prepareStatement(query);
            rs = stmt.executeQuery();
            while (rs.next()) {
                Rol vo = new Rol();
                vo.setRolNombre(rs.getString("rol_nombre"));
                vo.setDescripcion(rs.getString("descripcion"));
                c.add(vo);
            }

        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return c;
    }

    public Collection<Rol> buscarFichaPorIdPaciente(int idPaciente) throws DAOExcepcion {
        String query = "SELECT * FROM tb_ficha_medica where id_paciente = ?";
        Collection<Rol> lista = new ArrayList<Rol>();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, idPaciente);
            rs = stmt.executeQuery();
            while (rs.next()) {
                Rol vo = new Rol();
                vo.setId_ficha_medica(rs.getInt("id_ficha_medica"));
                vo.setEstado(rs.getString("estado"));
                vo.setFec_registro(rs.getString("fec_registro"));
                vo.setId_medico(rs.getInt("id_medico"));
                vo.setId_paciente(rs.getInt("id_paciente"));
                lista.add(vo);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        System.out.println(lista.size());
        return lista;
    }

    public Collection<Resultado> buscarResultadosPorIdFicha(int id) throws DAOExcepcion {
        String query = "SELECT a.id_resultado, e.descripcion as analisis, a.descripcion, a.fec_registro, a.estado_publicacion FROM tb_resultado as a inner join tb_analisis as e on a.id_analisis = e.id_analisis where a.id_ficha_medica = ?";
        Collection<Resultado> lista = new ArrayList<Resultado>();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, id);
            rs = stmt.executeQuery();
            while (rs.next()) {
                Resultado vo = new Resultado();
                vo.setId_resultado(rs.getInt("id_resultado"));
                vo.setDescripcion_analisis(rs.getString("analisis"));
                vo.setDescripcion_resultado(rs.getString("descripcion"));
                vo.setFec_registro(rs.getString("fec_registro"));
                vo.setEstado_publicacion(rs.getInt("estado_publicacion"));
                lista.add(vo);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        System.out.println(lista.size());
        return lista;
    }
}

